package cz.cvut.fel.y36pda.hs.masekji4.jirina.setting;

import net.rim.device.api.crypto.MD5Digest;

/**
 * Třída <code>MD5</code> poskytuje hašovací funkci MD5.
 *
 * @author masekji4@fel.cvut.cz
 */
// http://supportforums.blackberry.com/t5/Java-Development/String-to-MD5/td-p/86072;jsessionid=1B0FF02B33761C3055D900D338751B24
public class MD5 {
    /**
     * Převede pole znaků do hexadecimálního zápisu.
     *
     * @param data      pole znaků
     * @return          hexadecimální zápis
     */
    private static String convertToHex(byte[] data) {
        StringBuffer buf = new StringBuffer();

        for (int i = 0; i < data.length; i++) {
            int halfbyte = (data[i] >>> 4) & 0x0F;
            int two_halfs = 0;

            do {
                if ((0 <= halfbyte) && (halfbyte <= 9)) {
                    buf.append((char) ('0' + halfbyte));
                } else {
                    buf.append((char) ('a' + (halfbyte - 10)));
                }
                
                halfbyte = data[i] & 0x0F;
            } while(two_halfs++ < 1);
        }

        return buf.toString();
    }

    /**
     * Ze zadaného textového řetězce vygeneruju hash code
     *
     * @param string        textový řetězec
     * @return              hash kód
     * @throws Exception
     */
    public static String getHash(String string) {
        byte[] bytes = string.getBytes();
        MD5Digest digest = new MD5Digest();
        digest.update(bytes, 0, bytes.length);
        int length = digest.getDigestLength();
        byte[] md5 = new byte[length];
        digest.getDigest(md5, 0, true);
        return convertToHex(md5);
   }
}
